#ifndef GDL_GAME_HPP
# define GDL_GAME_HPP

#include "GameClock.hpp"
#include "Input.hpp"
#include "Window.hpp"

namespace	gdl
{
	////////////////////////////////////////////////////////////
	/// Forward declaration of GameImpl.
	////////////////////////////////////////////////////////////
	class GameImpl;
	////////////////////////////////////////////////////////////
	/// The Window class offers you an easier way to develop a game.
	/// You just need to inherite from it and override three
	/// methods : initialize, update and draw.
	////////////////////////////////////////////////////////////

	//	class GameClock;
	class Clock;

	class	Game
	{
	public:
		////////////////////////////////////////////////////////////
		/// Default constructor.
		////////////////////////////////////////////////////////////
		Game(void);
		////////////////////////////////////////////////////////////
		/// Default destructor.
		////////////////////////////////////////////////////////////
		virtual		~Game(void);
		////////////////////////////////////////////////////////////
		/// Call the initialize methode, create the window.
		/// While the window is open call update, draw and display
		/// the window.
		////////////////////////////////////////////////////////////
		void		run(void);

		////////////////////////////////////////////////////////////
		/// Get the root for the Content.
		///
		/// \return Path to the Root.
		////////////////////////////////////////////////////////////
		std::string const & getContentRoot(void) const;

		////////////////////////////////////////////////////////////
		/// Set the root for the Content.
		///
		/// \param[in] name Path to the Root.
		////////////////////////////////////////////////////////////
		void			setContentRoot(std::string const &);

	protected:
		////////////////////////////////////////////////////////////
		/// To override.
		////////////////////////////////////////////////////////////
		virtual void	initialize(void) = 0;
		////////////////////////////////////////////////////////////
		/// To override.
		////////////////////////////////////////////////////////////
		virtual void	update(void) = 0;
		////////////////////////////////////////////////////////////
		/// To override.
		////////////////////////////////////////////////////////////
		virtual void	draw(void) = 0;
		////////////////////////////////////////////////////////////
		/// To override.
		////////////////////////////////////////////////////////////
		virtual void	unload(void) = 0;

		////////////////////////////////////////////////////////////
		/// Game window.
		////////////////////////////////////////////////////////////
		Window			window_;

		////////////////////////////////////////////////////////////
		/// Game clock.
		////////////////////////////////////////////////////////////
		GameClock		gameClock_;

		////////////////////////////////////////////////////////////
		/// Input manager.
		////////////////////////////////////////////////////////////
		Input			input_;

	private:
		////////////////////////////////////////////////////////////
		/// Game Implementation
		////////////////////////////////////////////////////////////
		GameImpl&		gameInternal_;

	};
}

#endif /* !GDL_GAME_HPP */
